home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / 3dview12.zip / 3DVIEWER.CPP < prev    next >
C/C++ Source or Header  |  1996-05-30  |  13KB  |  381 lines

  1. #include <stdio.h>
  2. #include <bios.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <i86.h>
  7. #include <string.h>
  8.  
  9. #include "defines.hpp"
  10.  
  11. #include "vesa.hpp"
  12. #include "3d.hpp"
  13. #include "vesa3d.hpp"
  14. #include "misc.hpp"
  15. #include "mouse.hpp"
  16.  
  17. void ShowTitle() {
  18.     printf( "# 3D-BMP-Viewer V1.2   (w) by P.Kayser 1996 \n" );
  19.     printf( "# EMAIL : p.kayser@tu-bs.de | COMPUSERVE: 100517,3516\n" );
  20. };
  21.  
  22. void ShowUsage() {
  23.     printf( "# usage : 3dview (-abdlmwz) <file(.bmp)> (<mode>)\n" );
  24.     printf( "# \n" );
  25.     printf( "# options\n" );
  26.     printf( "#   -a        : show additional informations.\n" );
  27.     printf( "#   -b        : disable bitmap.\n" );
  28.     printf( "#   -d<dist>  : distance. <dist> from 0.01 (far) to 3 (near).\n" );
  29.     printf( "#   -l        : list available 256-color-modes.\n" );
  30.     printf( "#   -m        : enable mouse-control.\n" );
  31.     printf( "#   -w        : if screen flickers, try this.\n" );
  32.     printf( "#   -z        : enable z-buffer.\n" );
  33. };
  34.  
  35. void ShowAddInfo() {
  36.     printf( "# \n" );
  37.     printf( "# Needs VBE version 2.0. If your graphic card has an older VBE version,\n" );
  38.     printf( "# get shareware UniVBE 5.1a or newer from www.scitechsoft.com!\n" );
  39.     printf( "# Only 256-color-modes allowed.\n" );
  40.     printf( "# Some modes may not work even when the mode is listed using the\n");
  41.     printf( "# '-l'-option. Because this program uses double-buffered animation,\n" );
  42.     printf( "# you will for example need 2 MB on your graphic card for 1024x768.\n" );
  43.     printf( "# The bitmap must be '256-color-WINDOWS-RGB-encoded' and should have\n" );
  44.     printf( "# a maximum of 192 colors. Use a program like shareware Paintshop\n" );
  45.     printf( "# Pro to convert to .BMP and decrease color depth to 192.\n" );
  46. };
  47.  
  48. void main( int argc, char *argv[] ) {
  49.  
  50.     Boolean ListModes = False;
  51.     Boolean ShowBitmap = True;
  52.     Boolean ShowAddInfos = False;
  53.     Boolean WithZBuffer = False;
  54.     Boolean MouseControl = False;
  55.     Boolean WaitVRetrace = False;
  56.     double MinZoom = 0.01;
  57.     double MaxZoom = 3;
  58.     double NormZoom = 1.5;
  59.     double Distance = NormZoom;
  60.     int CmdCount = 1;
  61.     char Buffer [15];
  62.  
  63.     VESA_SetTextMode();
  64.     ShowTitle();
  65.  
  66.     if ( VESA_Boot() != 0 ) {
  67.         return;
  68.     };
  69.  
  70.     if ( argc == CmdCount ) {
  71.         ShowUsage();
  72.         return;
  73.     };
  74.  
  75.     while ( (argv[CmdCount])[0] == '-' ) {
  76.         int OptCount = 1;
  77.         while ( OptCount < strlen( argv[CmdCount] ) ) {
  78.             switch ( (argv[CmdCount])[OptCount] ) {
  79.                 case 'a' :
  80.                     ShowAddInfos = True;
  81.                     break;
  82.                 case 'b' :
  83.                     ShowBitmap = False;
  84.                     break;
  85.                 case 'd' :
  86.                     Distance = strtod( strncpy( Buffer,
  87.                                                 &(argv[CmdCount])[OptCount+1],
  88.                                                 strlen( argv[CmdCount] ) - OptCount ),
  89.                                        NULL );
  90.                     if ( Distance < MinZoom || Distance > MaxZoom )
  91.                         Distance = NormZoom;
  92.                     OptCount = strlen ( argv[CmdCount] );                                       
  93.                     break;
  94.                 case 'l' :
  95.                     ListModes = True;
  96.                     break;
  97.                 case 'm' :
  98.                     MouseControl = True;
  99.                     break;
  100.                 case 'w' :
  101.                     WaitVRetrace = True;
  102.                     break;
  103.                 case 'z' :
  104.                     WithZBuffer = True;
  105.                     break;
  106.                 default:
  107.                     printf( "\n" );
  108.                     printf( "ERROR : '%c' is an unknown option !\n" , argv[CmdCount][OptCount] );
  109.                     return;
  110.             }
  111.             OptCount++;
  112.         };
  113.         CmdCount++;
  114.     };
  115.  
  116.     if ( ShowAddInfos == True ) {
  117.         ShowUsage();
  118.         ShowAddInfo();
  119.         return;       
  120.     };
  121.  
  122.     if ( ListModes == True ) {
  123.         printf( "\n" );
  124.         VESA_PrintModeList8B();
  125.         return;
  126.     };
  127.  
  128.     static VESA3D_Texture TEX;
  129.     char* Filename = new char [256];
  130.     strcpy( Filename, argv[CmdCount] );
  131.  
  132.     if ( VESA3D_LoadTexture( Filename, TEX ) != 0 )
  133.         if ( VESA3D_LoadTexture( strcat( Filename, ".BMP" ), TEX ) != 0 ) {
  134.             printf( "\n" );
  135.             printf( "ERROR : Could not open .BMP-File !\n" );
  136.             return;
  137.     };
  138.  
  139.     VESA3D_ConvertTexture( TEX );
  140.  
  141.     CmdCount++;
  142.  
  143.     WORD Mode;
  144.     
  145.     if ( argc == CmdCount ) {
  146.         Mode = 0x0101;
  147.     }
  148.     else {
  149.         Mode = WORD( strtoul( argv[CmdCount], NULL, 16 ) );
  150.     };
  151.  
  152.     if ( VESA_InitMode( Mode ) != 0 ) {
  153.         return;
  154.     };
  155.  
  156.     if ( VESA_BpP != 8 ) {
  157.         printf( "\n" );
  158.         printf( "ERROR: Not a 256-Color-Mode !\n" );
  159.         return;
  160.     };
  161.  
  162.     VESA3D_Init();
  163.     if ( WithZBuffer == True )
  164.         VESA3D_MakeZBuffer();
  165.  
  166.     for ( int i = 46; i >= 0; i-- )
  167.         VESA_SetColor8B( WORD(239-i) ,
  168.                          WORD(64+i*3),
  169.                          WORD(64+i*3),
  170.                          WORD(64+i*3) );
  171.  
  172.     for ( i = 15; i >= 0; i-- )
  173.         VESA_SetColor8B( WORD(255-i),
  174.                          WORD(128+i*8),
  175.                          WORD(128+i*8),
  176.                          WORD(128+i*8) );
  177.  
  178.     VESA_SetColor8B( 0, 0, 0, 0 );
  179.  
  180.     if ( ShowBitmap == True )
  181.         VESA3D_SetTexturePalette( TEX, 192 );
  182.  
  183.     double px, py;
  184.  
  185.     if ( TEX.TDY > TEX.TDX ) {
  186.         px = 1;
  187.         py = double(TEX.TDY) / TEX.TDX;
  188.     }
  189.     else {
  190.         py = 1;
  191.         px = double(TEX.TDX) / TEX.TDY;
  192.     };
  193.  
  194.     long p1 = _3D_NewPoint(  0, py, 0 );
  195.     long p2 = _3D_NewPoint( px, py, 0 );
  196.     long p3 = _3D_NewPoint( px,  0, 0 );
  197.     long p4 = _3D_NewPoint(  0,  0, 0 );
  198.  
  199.     double dx = 0.25, dz = 0.05;
  200.  
  201.     long p5  = _3D_NewPoint( -dx, -dx, dz );
  202.     long p6  = _3D_NewPoint( -dx, -dx, -dz );
  203.     long p7  = _3D_NewPoint( px+dx, -dx, dz );
  204.     long p8  = _3D_NewPoint( px+dx, -dx, -dz );
  205.     long p9  = _3D_NewPoint( -dx, py+dx, dz );
  206.     long p10 = _3D_NewPoint( -dx, py+dx, -dz );
  207.     long p11 = _3D_NewPoint( px+dx, py+dx, dz );
  208.     long p12 = _3D_NewPoint( px+dx, py+dx, -dz );
  209.  
  210.     long p13 = _3D_NewPoint( 0, 0, dz );
  211.     long p14 = _3D_NewPoint( 0, 0, -dz );
  212.     long p15 = _3D_NewPoint( px, 0, dz );
  213.     long p16 = _3D_NewPoint( px, 0, -dz );
  214.     long p17 = _3D_NewPoint( 0, py, dz );
  215.     long p18 = _3D_NewPoint( 0, py, -dz );
  216.     long p19 = _3D_NewPoint( px, py, dz );
  217.     long p20 = _3D_NewPoint( px, py, -dz );
  218.  
  219.     double ds = 0.2;
  220.  
  221.     long p21 = _3D_NewPoint( px/2-ds, py/2+ds, ds );
  222.     long p22 = _3D_NewPoint( px/2+ds, py/2+ds, ds );
  223.     long p23 = _3D_NewPoint( px/2+ds, py/2+ds, -ds );
  224.     long p24 = _3D_NewPoint( px/2-ds, py/2+ds, -ds );
  225.     long p25 = _3D_NewPoint( px/2-ds, py/2-ds, ds );
  226.     long p26 = _3D_NewPoint( px/2+ds, py/2-ds, ds );
  227.     long p27 = _3D_NewPoint( px/2+ds, py/2-ds, -ds );
  228.     long p28 = _3D_NewPoint( px/2-ds, py/2-ds, -ds );
  229.  
  230.     DWORD PalStart = 193;
  231.  
  232.     _3D_Triangle_SideTyp S = Singlesided;
  233.     _3D_Triangle_Typ T;
  234.     long G = 0;
  235.     if ( WithZBuffer == True )
  236.         T = GouraudShadedZBuf;
  237.     else
  238.         T = GouraudShaded;
  239.  
  240.     if ( ShowBitmap == True )
  241.         if ( WithZBuffer == True )
  242.             VESA3D_New3DTexQuad (  p1,  p2,  p3,  p4, TEX, Doublesided, TexturedZBuf );
  243.         else
  244.             VESA3D_New3DTexQuad (  p1,  p2,  p3,  p4, TEX, Doublesided, Textured );
  245.  
  246.     VESA3D_New3DQuadx(  p5,  p7,  p8,  p6, PalStart, S, T, G ); 
  247.     VESA3D_New3DQuadx(  p9,  p5,  p6, p10, PalStart, S, T, G ); 
  248.     VESA3D_New3DQuadx( p11,  p9, p10, p12, PalStart, S, T, G );
  249.     VESA3D_New3DQuadx(  p7, p11, p12,  p8, PalStart, S, T, G );
  250.     VESA3D_New3DQuadx(  p9, p17, p13,  p5, PalStart, S, T, G );
  251.     VESA3D_New3DQuadx(  p6, p14, p18, p10, PalStart, S, T, G );
  252.     VESA3D_New3DQuadx(  p9, p11, p19, p17, PalStart, S, T, G );
  253.     VESA3D_New3DQuadx( p18, p20, p